package icontrolv2

import org.springframework.dao.DataIntegrityViolationException

class TareaController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [tareaInstanceList: Tarea.list(params), tareaInstanceTotal: Tarea.count()]
    }

    def create() {
        def proyecto = Proyecto.get(params.proyectoId)
        
        [tareaInstance: new Tarea(params), proyecto:proyecto]
    }

    def save() {
        def fechaHoy = new Date()
        def tareaInstance = new Tarea(params)
        def proyecto = Proyecto.get(params.id)
        def usuario = Usuario.get(params.usuario.id)
        
        if(params.fechaInicio < (fechaHoy - 1)) {
            flash.error = "No puede crear una tarea con una fecha menor a la actual"
            redirect(controller: "proyecto", action: "show", id: proyecto.id)
            return
        }
        
        if(params.fechaTermino < params.fechaInicio) {
            flash.error = "La fecha de término no puede ser menor a la fecha de inicio"
            redirect(controller: "proyecto", action: "show", id: proyecto.id)
            return
        }
        
        def tareasUsuario = Tarea.findAll("from Tarea as tarea where tarea.fechaInicio between ? and tarea.fechaTermino and usuario_id = ?", [params.fechaInicio, params.usuario.id])
        
        Estado estado = Estado.get(1)
        
        tareaInstance.estado = estado
        
        if(tareasUsuario.size() > 0) {
            flash.error = "El Usuario seleccionado ya tiene una tarea asignada dentro del rango de fechas seleccionado"
            redirect(controller: "proyecto", action: "show", id: proyecto.id)
            return
        }
        
        if (!tareaInstance.save(flush: true)) {
            flash.error = "La tarea no se ha grabado, favor intente nuevamente"
            redirect(controller: "proyecto", action: "show", id: proyecto.id)
            return
        }

        flash.message = message(code: 'default.created.message', args: [message(code: 'tarea.label', default: 'Tarea'), tareaInstance.id])
        redirect(controller:'proyecto', action: "show", id: params.proyecto.id)
    }

    def show() {
        def tareaInstance = Tarea.get(params.id)
        if (!tareaInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
            return
        }

        [tareaInstance: tareaInstance]
    }

    def edit() {
        def tareaInstance = Tarea.get(params.id)
        def proyecto      = Proyecto.get(params.proyectoId)
        if (!tareaInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
            return
        }

        [tareaInstance: tareaInstance, proyecto: proyecto]
    }
    
    def editModal() {
        def proyecto = Proyecto.get(params.proyectoId)
        def tareaInstance = Tarea.get(params.id)
        if (!tareaInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
            return
        }

        [tareaInstance: tareaInstance, proyecto:proyecto]
    }

    def update() {
        def tareaInstance = Tarea.get(params.id)
        if (!tareaInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (tareaInstance.version > version) {
                tareaInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                          [message(code: 'tarea.label', default: 'Tarea')] as Object[],
                          "Another user has updated this Tarea while you were editing")
                render(view: "edit", model: [tareaInstance: tareaInstance])
                return
            }
        }

        tareaInstance.properties = params

        if (!tareaInstance.save(flush: true)) {
            render(view: "edit", model: [tareaInstance: tareaInstance])
            return
        }

		flash.message = message(code: 'default.updated.message', args: [message(code: 'tarea.label', default: 'Tarea'), tareaInstance.id])
        redirect(controller:'proyecto', action: "show", id: tareaInstance.proyecto.id)
    }

    def delete() {
        def tareaInstance = Tarea.get(params.id)
        if (!tareaInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
            return
        }

        try {
            tareaInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "list")
        }
        catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'tarea.label', default: 'Tarea'), params.id])
            redirect(action: "show", id: params.id)
        }
    }
    
    def buscarTareasNombre(){
        def fechaActual = new Date()
        def tareas = Tarea.withCriteria {
            proyecto {
                eq('id', params.proyectoId.toLong())
            }
            like('descripcion', '%' + params.q + '%')
        }
        
        render(view: "buscarTareasNombre", model: [tareas:tareas, tareaInstanceTotal:tareas.size(), fechaActual:fechaActual])
    }
    
    def buscarTareasPadre(){
        def fechaActual = new Date()
        def tareas = Tarea.withCriteria {
            proyecto {
                eq('id', params.proyectoId.toLong())
            }
            eq('padre', params.idPadre?.toInteger())
        }
        
        render(view: "buscarTareasPadre", model: [tareas:tareas, tareaInstanceTotal:tareas.size(), fechaActual:fechaActual])
    }
    
    def buscarTareasFueraPlazo(){
        def fechaActual = new Date()
        def tareas = Tarea.withCriteria {
            proyecto {
                eq('id', params.proyectoId.toLong())
            }
        }
        
        render(view: "buscarTareasFueraPlazo", model: [tareas:tareas, tareaInstanceTotal:tareas.size(), fechaActual:fechaActual])
    }
    
    def tomarTarea(){
        def tarea               = Tarea.get(params.id)
        tarea.fechaTomaTarea    = new Date()
        tarea.estado            = Estado.get(2)
        
        flash.tareaTomada       = "Se ha tomado la tarea"
        
        redirect(controller:"home", action:"index")
    }
    
    def terminarTarea(){
        def tarea = Tarea.get(params.id)
        tarea.estado = Estado.get(4)
        
        redirect(controller:'proyecto', action:'show', id:tarea.proyecto.id)
    }
    
    def pausarTarea(){
        def tarea = Tarea.get(params.id)
        tarea.estado = Estado.get(3)
        
        redirect(controller:'proyecto', action:'show', id:tarea.proyecto.id)
    }
    
    def agregarComentario() {
        if(request.post) {
            def comentario = new Comentario()
            def proyecto = Proyecto.get(params.proyectoId)
            comentario.setFecha(new Date())
            comentario.setComentario(params.comentario)
            comentario.setTarea(Tarea.get(params.tarea))
            
            if(comentario.save(flush: true)) {
                flash.mensajeExito = "Comentario grabado exitosamente"
                redirect(action: 'edit', id: params.tarea, params:[proyectoId:proyecto.getId()])
            }else {
                flash.mensajeError = "El comentario no ha sido grabado, intente nuevamente."
                redirect(action: 'edit', id: params.tarea, params:[proyectoId:proyecto.getId()])
            }
        }

        [proyectoId:params.proyectoId]
    }
    
    def calificarTarea() {
        def tareaInstance = Tarea.get(params.id)
        
        def califica = Calificacion.findAllWhere(tarea:tareaInstance)
        
        if(request.post) {
            def calificacion = new Calificacion()
            def fechaCalificacion = new Date()
            def tipoCalificacion = TipoCalificacion.get(params.tipoCalificacion.id)
            
            calificacion.setDescripcion(params.comentariosCalificacion.toString())
            calificacion.setFechaCalificacion(fechaCalificacion)
            calificacion.setTarea(tareaInstance)
            calificacion.setTipoCalificacion(tipoCalificacion)
            
            if(calificacion.save(flush:true)) {
                flash.message = "La tarea se ha calificado"
                redirect(controller: "proyecto", action: "show", id:tareaInstance.proyecto.id)
            } else {
                flash.error = "Ha ocurrido un error al calificar la tarea, favor intente nuevamente"
            }
        }
        
        [
            tareaInstance:tareaInstance
            ,califica:califica
        ]
    }
    
}
